package cn.zzz.openplatform.amap.model.direction;

import cn.hutool.core.annotation.Alias;
import cn.zzz.openplatform.amap.model.AmapOpenApiResponse;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.math.BigDecimal;
import java.util.List;

/**
 * 公交路径规划响应结果
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class AmapTransitIntegratedDirectionResponse extends AmapOpenApiResponse {
    /**
     * 路线信息
     */
    private Route route;

    @Data
    public static class Route {
        /**
         * 起点坐标
         */
        private String origin;

        /**
         * 终点坐标
         */
        private String destination;

        /**
         * 起点和终点的步行距离, 单位：米
         */
        private Integer distance;

        /**
         * 出租车费用, 单位：元
         */
        @Alias("taxi_cost")
        private BigDecimal taxiCost;

        /**
         * 公交换乘方案列表
         */
        private List<Transit> transits;
    }

    @Data
    public static class Transit {
        /**
         * 此换乘方案价格, 单位：元
         */
        private Double cost;

        /**
         * 此换乘方案预期时间, 单位：秒
         */
        private Integer duration;

        /**
         * 是否是夜班车
         * 0：非夜班车；1：夜班车
         */
        private Integer nightflag;

        /**
         * 此方案总步行距离, 单位：米
         */
        @Alias("walking_distance")
        private Integer walkingDistance;

        /**
         * 换乘路段列表
         */
        private List<Segment> segments;
    }

    @Data
    public static class Segment {
        /**
         * 此路段步行导航信息
         */
        private Walking walking;

        /**
         * 此路段公交导航信息
         */
        private Bus bus;

        /**
         * 地铁入口
         */
        private EntranceExit entrance;

        /**
         * 地铁出口
         */
        private EntranceExit exit;

        /**
         * 乘坐火车的信息
         */
        private Railway railway;
    }

    @Data
    public static class Walking {
        /**
         * 起点坐标
         */
        private String origin;

        /**
         * 终点坐标
         */
        private String destination;

        /**
         * 每段线路步行距离, 单位：米
         */
        private Integer distance;

        /**
         * 步行预计时间, 单位：秒
         */
        private Integer duration;

        /**
         * 步行路段列表
         */
        private List<Step> steps;
    }

    @Data
    public static class Step {
        /**
         * 此段路的行走介绍
         */
        private String instruction;

        /**
         * 路的名字
         */
        private String road;

        /**
         * 此段路的距离, 单位：米
         */
        private Integer distance;

        /**
         * 此段路预计消耗时间, 单位：秒
         */
        private Integer duration;

        /**
         * 此段路的坐标
         */
        private String polyline;

        /**
         * 步行主要动作
         */
        private String action;

        /**
         * 步行辅助动作
         */
        @Alias("assistant_action")
        private String assistantAction;
    }

    @Data
    public static class Bus {
        /**
         * 步行路段列表
         */
        private List<BusLine> buslines;

        /**
         * 此段起乘站信息
         */
        @Alias("departure_stop")
        private Stop departureStop;

        /**
         * 此段下车站
         */
        @Alias("arrival_stop")
        private Stop arrivalStop;
    }

    @Data
    public static class BusLine {
        /**
         * 公交路线名称
         */
        private String name;

        /**
         * 公交路线 id
         */
        private String id;

        /**
         * 公交类型
         */
        private String type;

        /**
         * 公交行驶距离, 单位：米
         */
        private Integer distance;

        /**
         * 公交预计行驶时间, 单位：秒
         */
        private Integer duration;

        /**
         * 此路段坐标集
         */
        private String polyline;

        /**
         * 首班车时间
         */
        @Alias("start_time")
        private String startTime;

        /**
         * 末班车时间
         */
        @Alias("end_time")
        private String endTime;

        /**
         * 此段途经公交站数
         */
        @Alias("via_num")
        private Integer viaNum;

        /**
         * 此段途经公交站点列表
         */
        @Alias("via_stops")
        private List<ViaStop> viaStops;
    }

    @Data
    public static class ViaStop {
        /**
         * 途径公交站点信息
         */
        private String name;

        /**
         * 公交站点编号
         */
        private String id;

        /**
         * 公交站点经纬度
         */
        private String location;
    }

    @Data
    public static class Stop {
        /**
         * 站点名字
         */
        private String name;

        /**
         * 站点 id
         */
        private String id;

        /**
         * 站点经纬度
         */
        private String location;
    }

    @Data
    public static class EntranceExit {
        /**
         * 入口名称
         */
        private String name;

        /**
         * 入口经纬度
         */
        private String location;
    }

    @Data
    public static class Railway {
        /**
         * 线路 id 编号
         */
        private String id;

        /**
         * 该线路车段耗时
         */
        private Integer time;

        /**
         * 线路名称
         */
        private String name;

        /**
         * 线路车次号
         */
        private String trip;

        /**
         * 该 item 换乘段的行车总距离
         */
        private Integer distance;

        /**
         * 线路车次类型
         */
        private String type;

        /**
         * 火车始发站信息
         */
        @Alias("departure_stop")
        private StopInfo departureStop;

        /**
         * 火车到站信息
         */
        @Alias("arrival_stop")
        private StopInfo arrivalStop;

        /**
         * 途径站点信息，extensions=all 时返回
         */
        @Alias("via_stop")
        private List<StopInfo> viaStop;

        /**
         * 聚合的备选方案，extensions=all 时返回
         */
        private List<Alternative> alters;
    }

    @Data
    public static class StopInfo {
        /**
         * 上车站点 ID
         */
        private String id;

        /**
         * 上车站点名称
         */
        private String name;

        /**
         * 上车站点经纬度
         */
        private String location;

        /**
         * 上车站点所在城市的 adcode
         */
        private String adcode;

        /**
         * 上车点发车时间
         */
        private String time;

        /**
         * 是否始发站，1表示为始发站，0表示非始发站
         */
        private Integer start;
    }

    @Data
    public static class Alternative {
        /**
         * 备选方案 ID
         */
        private String id;

        /**
         * 备选线路名称
         */
        private String name;

        /**
         * 仓位及价格信息
         */
        private List<Cabin> spaces;
    }

    @Data
    public static class Cabin {
        /**
         * 仓位编码
         */
        private Integer code;

        /**
         * 仓位费用
         */
        private Double cost;
    }
}
